// HTTP基础配置和方法
// 服务器基础URL，便于修改地址
export const BASE_URL = 'https://dtwx.net.cn:8085';
// export const BASE_URL = 'http://127.0.0.1:8080';

// 用户注销事件发送器
function emitLogoutEvent() {
  const app = getApp<IAppOption>();
  if (app.globalData && app.globalData.eventBus) {
    app.globalData.eventBus.emit('user:logout');
  }
}

// 处理401权限失效
export function handleUnauthorized() {
  console.log('检测到401权限失效，触发用户注销');
  
  // 清除本地存储的token和用户信息
  wx.removeStorageSync('token');
  wx.removeStorageSync('userInfo');
  
  // 发送用户注销事件
  emitLogoutEvent();
  
  // 显示提示信息
  wx.showToast({
    title: '登录已过期，请重新登录',
    icon: 'none',
    duration: 2000
  });
  
  // 获取当前页面路径
  const pages = getCurrentPages();
  const currentPage = pages[pages.length - 1];
  const currentRoute = currentPage ? currentPage.route : '';
  
  // 如果当前不是profile页面，则跳转到profile页面
  if (currentRoute !== 'pages/profile/profile') {
    // 延迟跳转到登录页面，避免与toast冲突
    setTimeout(() => {
      wx.reLaunch({
        url: '/pages/profile/profile'
      });
    }, 2000);
  } else {
    console.log('当前已在profile页面，无需跳转');
  }
}

// 封装的请求方法，自动获取本地token作为header参数
export function request<T>(options: {
  url: string;
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
  data?: any;
  header?: Record<string, string>;
}): Promise<T> {
  return new Promise((resolve, reject) => {
    // 获取本地存储的token
    const token = wx.getStorageSync('token');
    
    // 合并请求头，如果有token则添加到header中
    const header: Record<string, string> = Object.assign({
      'content-type': 'application/json'
    }, options.header || {});
    
    // 如果token存在，添加到请求头中
    if (token) {
      header['Authorization'] = `Bearer ${token}`;
      console.info('aaaa:' + header['Authorization']);
    }
    
    wx.request({
      url: options.url.startsWith('http') ? options.url : `${BASE_URL}${options.url}`,
      method: options.method || 'GET',
      data: options.data,
      header,
      success: (res) => {
        // 检查HTTP状态码是否为401
        if (res.statusCode === 401) {
          handleUnauthorized();
          reject({ code: 401, msg: '登录已过期' });
          return;
        }
        
        // 这里可以根据业务需求统一处理响应
        const data = res.data as any;
        
        // 检查业务状态码是否为401
        if (data.code === 401) {
          handleUnauthorized();
          reject(data);
          return;
        }
        
        // 根据业务状态码判断请求是否成功
        if (data.code === 200) {
          resolve(data as T);
        } else {
          // 处理业务错误
          wx.showToast({
            title: data.msg || '请求失败',
            icon: 'none'
          });
          reject(data);
        }
      },
      fail: (err) => {
        wx.showToast({
          title: '网络异常',
          icon: 'none'
        });
        reject(err);
      }
    });
  });
}

// 手动触发用户注销（供其他页面调用）
export function triggerLogout() {
  handleUnauthorized();
}